package org.example.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 全局配置类 懒汉式单例类.在第一次调用的时候实例化自己
 */
public class AppConfig {
    private static final Logger logger = LoggerFactory.getLogger(AppConfig.class);

    private AppConfig() {
    }

    //  单例类 开始
    private static AppConfig config = null;

    /**
     * 静态工厂方法 获取当前对象实例 多线程安全单例模式(使用双重同步锁)
     */
    public static synchronized AppConfig getInstance() {
        if (config == null) {
            synchronized (AppConfig.class) {
                if (config == null) {
                    config = new AppConfig();
                }
            }
        }
        return config;
    }
    //  单例类 结束

    //  加载Properties 开始
    private static Properties properties = null;
    /**
     * 静态工厂方法 获取当前对象实例 多线程安全单例模式(使用双重同步锁)
     */
    public static synchronized Properties getProperties() {
        if (properties == null) {
            synchronized (AppConfig.class) {
                if (properties == null) {
                    try {
                        properties = PropertiesLoaderUtils.loadProperties(new ClassPathResource("properties/app.properties"));
                    } catch (IOException e) {
                        properties = null;
                        logger.error("加载 app.properties 异常", e);
                    }
                }
            }
        }
        return properties;
    }
    //  加载Properties 结束

    /**
     * 保存全局属性值
     */
    private static Map<String, String> map = new HashMap<>();

    /**
     * 获取配置
     */
    public static String getConfig(String key) {
        String value = map.get(key);
        if (value == null) {
            value = properties.getProperty(key, "");
            map.put(key, value);
        }
        return value;
    }

    /**
     * 获取应用名称
     * @return 应用名称
     */
    public static String getAppName() {
        return getConfig("app.name");
    }
    
}
